package pilegen;

import java.util.ArrayList;

public class Variable {
	/* l'attribut type est inutile, on peut le recuperer de valeur.getClass()
	 * une variable a toujours un attribut valeur non null */
	/* on pourrait ajouter un attribut variablesMeres indiquant si une variable donnee est
	 * un attribut d'une ou plusieurs autres variables. Dans ce cas, ces autres classes
	 * seront stockees dans cet attribut. Il faudrait egalement pouvoir connaitre le numero
	 * de l'attribut de la variable mere a laquelle la variable est liee... */
	public Class type;
	public String name;
	public Object valeur;
	/* plusieurs poignees de meme type peuvent pointer vers une meme variable */
	public ArrayList<Poignee> poignees;
	/* une variable mere peut avoir plusieurs attributs de meme type et de meme valeur, 
	 * ie pointant vers la meme variable fille. Pour les differencier il faut donc stocker
	 * dans la variable fille la variable mere mais aussi le nom de l'attribut de la variable mere.
	 * A tout moment, variablesMeres et attributsPeres seront de meme taille */
	public ArrayList<Variable> variablesMeres;
	public ArrayList<String> attributsPeres;
	/* abscisse et ordonnee du coin superieur gauche du rectangle qui representera cette variable
	 * lors de l'affichage. Ces attributs seront fixes dans DrawEnvironnement */
	public int xaff;
	public int yaff;
	
	public Variable(Class type, String name, Object valeur){
		this.type = type;
		this.name = name;
		this.valeur = valeur;
		this.poignees = new ArrayList<Poignee>();
		this.variablesMeres = new ArrayList<Variable>();
		this.attributsPeres = new ArrayList<String>();
	}
	
	public Variable(String name, Object val){
		this.type = val.getClass();
		this.name = name;
		this.valeur = val;
		this.poignees = new ArrayList<Poignee>();
		this.variablesMeres = new ArrayList<Variable>();
		this.attributsPeres = new ArrayList<String>();
	}
	
	public Variable(Class type, String name){
		this.type = type;
		this.name = name;
		this.valeur = null;
		this.poignees = new ArrayList<Poignee>();
		this.variablesMeres = new ArrayList<Variable>();
		this.attributsPeres = new ArrayList<String>();
	}
	
	public Variable(Class type, String name, Object valeur,
			ArrayList<Poignee> poignees, ArrayList<Variable> variablesMeres,
			ArrayList<String> attributsPeres, int xaff, int yaff) {
		super();
		this.type = type;
		this.name = name;
		this.valeur = valeur;
		this.poignees = poignees;
		this.variablesMeres = variablesMeres;
		this.attributsPeres = attributsPeres;
		this.xaff = xaff;
		this.yaff = yaff;
	}

	public void retirePoignee(String namepgn){
		int k = 0;
		while((k<poignees.size())){
			if(poignees.get(k).nom.equals(namepgn)){
				poignees.remove(k);
			}else{
				k++;
			}
		}
	}
	
	public Variable cloneVariable(){
		return new Variable(this.type, this.name, this.valeur, (ArrayList<Poignee>) this.poignees.clone(),
				(ArrayList<Variable>) this.variablesMeres.clone(), (ArrayList<String>) this.attributsPeres.clone(),
				this.xaff, this.yaff);
	}
	
	public boolean possedeAttributDans(Variable varAtt){
		boolean hasField = false;
		for(int i=0; i<varAtt.variablesMeres.size(); i++){
			if(this.name.equals(varAtt.variablesMeres.get(i).name)){
				hasField = true;
			}
		}
		return hasField;
	}
	
	/*
	public ArrayList<Variable> cloneVariablesMeres(){
		ArrayList<Variable> varsmeresclone = new ArrayList<Variable>();
		for(int i=0; i<this.variablesMeres.size(); i++){
			Variable varmere_i = this.variablesMeres.get(i);
			int x = new Integer(varmere_i.xaff);
			int y = new Integer(varmere_i.yaff);
			varsmeresclone.add(new Variable(varmere_i.type, varmere_i.name, null, null, null, null, 
					x, y));
		}
		return varsmeresclone;
	}
	*/
	
}